home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / ZSI / wstools / Utility.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  41KB  |  1,299 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. ident = '$Id: Utility.py 1405 2007-07-10 20:25:44Z boverhof $'
  5. import sys
  6. import types
  7. import httplib
  8. import urllib
  9. import socket
  10. import weakref
  11. from os.path import isfile
  12. from string import join, strip, split
  13. from UserDict import UserDict
  14. from cStringIO import StringIO
  15. from TimeoutSocket import TimeoutSocket, TimeoutError
  16. from urlparse import urlparse
  17. from httplib import HTTPConnection, HTTPSConnection
  18. from exceptions import Exception
  19.  
  20. try:
  21.     from ZSI import _get_idstr
  22. except:
  23.     
  24.     def _get_idstr(pyobj):
  25.         x = id(pyobj)
  26.         if x < 0:
  27.             return 'x%x' % abs(x)
  28.         
  29.         return 'o%x' % x
  30.  
  31.  
  32. import xml.dom.minidom as xml
  33. from xml.dom import Node
  34. import logging
  35. from c14n import Canonicalize
  36. from Namespaces import SCHEMA, SOAP, XMLNS, ZSI_SCHEMA_URI
  37.  
  38. try:
  39.     from xml.dom.ext import SplitQName
  40. except:
  41.     
  42.     def SplitQName(qname):
  43.         l = qname.split(':')
  44.         if len(l) == 1:
  45.             l.insert(0, None)
  46.         elif len(l) == 2:
  47.             if l[0] == 'xmlns':
  48.                 l.reverse()
  49.             
  50.         else:
  51.             return None
  52.         return tuple(l)
  53.  
  54.  
  55. basejoin = urllib.basejoin
  56. if sys.version_info[0:2] < (2, 4, 0, 'final', 0)[0:2]:
  57.     token = './'
  58.     
  59.     def basejoin(base, url):
  60.         if url.startswith(token) is True:
  61.             return urllib.basejoin(base, url[2:])
  62.         
  63.         return urllib.basejoin(base, url)
  64.  
  65.  
  66.  
  67. class NamespaceError(Exception):
  68.     pass
  69.  
  70.  
  71. class RecursionError(Exception):
  72.     pass
  73.  
  74.  
  75. class ParseError(Exception):
  76.     pass
  77.  
  78.  
  79. class DOMException(Exception):
  80.     pass
  81.  
  82.  
  83. class Base:
  84.     
  85.     def __init__(self, module = __name__):
  86.         self.logger = logging.getLogger('%s-%s(%s)' % (module, self.__class__, _get_idstr(self)))
  87.  
  88.  
  89.  
  90. class HTTPResponse:
  91.     
  92.     def __init__(self, response):
  93.         self.status = response.status
  94.         self.reason = response.reason
  95.         self.headers = response.msg
  96.         if not response.read():
  97.             pass
  98.         self.body = None
  99.         response.close()
  100.  
  101.  
  102.  
  103. class TimeoutHTTP(HTTPConnection):
  104.     
  105.     def __init__(self, host, port = None, timeout = 20):
  106.         HTTPConnection.__init__(self, host, port)
  107.         self.timeout = timeout
  108.  
  109.     
  110.     def connect(self):
  111.         self.sock = TimeoutSocket(self.timeout)
  112.         self.sock.connect((self.host, self.port))
  113.  
  114.  
  115.  
  116. class TimeoutHTTPS(HTTPSConnection):
  117.     
  118.     def __init__(self, host, port = None, timeout = 20, **kwargs):
  119.         HTTPSConnection.__init__(self, str(host), port, **kwargs)
  120.         self.timeout = timeout
  121.  
  122.     
  123.     def connect(self):
  124.         sock = TimeoutSocket(self.timeout)
  125.         sock.connect((self.host, self.port))
  126.         realsock = getattr(sock.sock, '_sock', sock.sock)
  127.         ssl = socket.ssl(realsock, self.key_file, self.cert_file)
  128.         self.sock = httplib.FakeSocket(sock, ssl)
  129.  
  130.  
  131.  
  132. def urlopen(url, timeout = 20, redirects = None):
  133.     (scheme, host, path, params, query, frag) = urlparse(url)
  134.     if scheme not in ('http', 'https'):
  135.         return urllib.urlopen(url)
  136.     
  137.     if params:
  138.         path = '%s;%s' % (path, params)
  139.     
  140.     if query:
  141.         path = '%s?%s' % (path, query)
  142.     
  143.     if frag:
  144.         path = '%s#%s' % (path, frag)
  145.     
  146.     if scheme == 'https':
  147.         
  148.         try:
  149.             import M2Crypto as M2Crypto
  150.         except ImportError:
  151.             if not hasattr(socket, 'ssl'):
  152.                 raise RuntimeError, 'no built-in SSL Support'
  153.             
  154.             conn = TimeoutHTTPS(host, None, timeout)
  155.  
  156.         ctx = M2Crypto.SSL.Context()
  157.         ctx.set_session_timeout(timeout)
  158.         conn = M2Crypto.httpslib.HTTPSConnection(host, ssl_context = ctx)
  159.         conn.set_debuglevel(1)
  160.     else:
  161.         conn = TimeoutHTTP(host, None, timeout)
  162.     conn.putrequest('GET', path)
  163.     conn.putheader('Connection', 'close')
  164.     conn.endheaders()
  165.     response = None
  166.     while None:
  167.         response = conn.getresponse()
  168.         if response.status != 100:
  169.             break
  170.         
  171.         conn._HTTPConnection__state = httplib._CS_REQ_SENT
  172.         conn._HTTPConnection__response = None
  173.         continue
  174.         status = response.status
  175.         if status >= 300 and status < 400:
  176.             location = response.msg.getheader('location')
  177.             if location is not None:
  178.                 response.close()
  179.                 if redirects is not None and redirects.has_key(location):
  180.                     raise RecursionError('Circular HTTP redirection detected.')
  181.                 
  182.                 if redirects is None:
  183.                     redirects = { }
  184.                 
  185.                 redirects[location] = 1
  186.                 return urlopen(location, timeout, redirects)
  187.             
  188.             raise HTTPResponse(response)
  189.         
  190.     if not status >= 200 and status < 300:
  191.         raise HTTPResponse(response)
  192.     
  193.     body = StringIO(response.read())
  194.     response.close()
  195.     return body
  196.  
  197.  
  198. class DOM:
  199.     NS_SOAP_ENV_1_1 = 'http://schemas.xmlsoap.org/soap/envelope/'
  200.     NS_SOAP_ENC_1_1 = 'http://schemas.xmlsoap.org/soap/encoding/'
  201.     NS_SOAP_ENV_1_2 = 'http://www.w3.org/2001/06/soap-envelope'
  202.     NS_SOAP_ENC_1_2 = 'http://www.w3.org/2001/06/soap-encoding'
  203.     NS_SOAP_ENV_ALL = (NS_SOAP_ENV_1_1, NS_SOAP_ENV_1_2)
  204.     NS_SOAP_ENC_ALL = (NS_SOAP_ENC_1_1, NS_SOAP_ENC_1_2)
  205.     NS_SOAP_ENV = NS_SOAP_ENV_1_1
  206.     NS_SOAP_ENC = NS_SOAP_ENC_1_1
  207.     _soap_uri_mapping = {
  208.         NS_SOAP_ENV_1_1: '1.1',
  209.         NS_SOAP_ENV_1_2: '1.2' }
  210.     SOAP_ACTOR_NEXT_1_1 = 'http://schemas.xmlsoap.org/soap/actor/next'
  211.     SOAP_ACTOR_NEXT_1_2 = 'http://www.w3.org/2001/06/soap-envelope/actor/next'
  212.     SOAP_ACTOR_NEXT_ALL = (SOAP_ACTOR_NEXT_1_1, SOAP_ACTOR_NEXT_1_2)
  213.     
  214.     def SOAPUriToVersion(self, uri):
  215.         value = self._soap_uri_mapping.get(uri)
  216.         if value is not None:
  217.             return value
  218.         
  219.         raise ValueError('Unsupported SOAP envelope uri: %s' % uri)
  220.  
  221.     
  222.     def GetSOAPEnvUri(self, version):
  223.         attrname = 'NS_SOAP_ENV_%s' % join(split(version, '.'), '_')
  224.         value = getattr(self, attrname, None)
  225.         if value is not None:
  226.             return value
  227.         
  228.         raise ValueError('Unsupported SOAP version: %s' % version)
  229.  
  230.     
  231.     def GetSOAPEncUri(self, version):
  232.         attrname = 'NS_SOAP_ENC_%s' % join(split(version, '.'), '_')
  233.         value = getattr(self, attrname, None)
  234.         if value is not None:
  235.             return value
  236.         
  237.         raise ValueError('Unsupported SOAP version: %s' % version)
  238.  
  239.     
  240.     def GetSOAPActorNextUri(self, version):
  241.         attrname = 'SOAP_ACTOR_NEXT_%s' % join(split(version, '.'), '_')
  242.         value = getattr(self, attrname, None)
  243.         if value is not None:
  244.             return value
  245.         
  246.         raise ValueError('Unsupported SOAP version: %s' % version)
  247.  
  248.     NS_XSD_99 = 'http://www.w3.org/1999/XMLSchema'
  249.     NS_XSI_99 = 'http://www.w3.org/1999/XMLSchema-instance'
  250.     NS_XSD_00 = 'http://www.w3.org/2000/10/XMLSchema'
  251.     NS_XSI_00 = 'http://www.w3.org/2000/10/XMLSchema-instance'
  252.     NS_XSD_01 = 'http://www.w3.org/2001/XMLSchema'
  253.     NS_XSI_01 = 'http://www.w3.org/2001/XMLSchema-instance'
  254.     NS_XSD_ALL = (NS_XSD_99, NS_XSD_00, NS_XSD_01)
  255.     NS_XSI_ALL = (NS_XSI_99, NS_XSI_00, NS_XSI_01)
  256.     NS_XSD = NS_XSD_01
  257.     NS_XSI = NS_XSI_01
  258.     _xsd_uri_mapping = {
  259.         NS_XSD_99: NS_XSI_99,
  260.         NS_XSD_00: NS_XSI_00,
  261.         NS_XSD_01: NS_XSI_01 }
  262.     for key, value in _xsd_uri_mapping.items():
  263.         _xsd_uri_mapping[value] = key
  264.     
  265.     
  266.     def InstanceUriForSchemaUri(self, uri):
  267.         return self._xsd_uri_mapping.get(uri)
  268.  
  269.     
  270.     def SchemaUriForInstanceUri(self, uri):
  271.         return self._xsd_uri_mapping.get(uri)
  272.  
  273.     NS_WSDL_1_1 = 'http://schemas.xmlsoap.org/wsdl/'
  274.     NS_WSDL_ALL = (NS_WSDL_1_1,)
  275.     NS_WSDL = NS_WSDL_1_1
  276.     NS_SOAP_BINDING_1_1 = 'http://schemas.xmlsoap.org/wsdl/soap/'
  277.     NS_HTTP_BINDING_1_1 = 'http://schemas.xmlsoap.org/wsdl/http/'
  278.     NS_MIME_BINDING_1_1 = 'http://schemas.xmlsoap.org/wsdl/mime/'
  279.     NS_SOAP_BINDING_ALL = (NS_SOAP_BINDING_1_1,)
  280.     NS_HTTP_BINDING_ALL = (NS_HTTP_BINDING_1_1,)
  281.     NS_MIME_BINDING_ALL = (NS_MIME_BINDING_1_1,)
  282.     NS_SOAP_BINDING = NS_SOAP_BINDING_1_1
  283.     NS_HTTP_BINDING = NS_HTTP_BINDING_1_1
  284.     NS_MIME_BINDING = NS_MIME_BINDING_1_1
  285.     NS_SOAP_HTTP_1_1 = 'http://schemas.xmlsoap.org/soap/http'
  286.     NS_SOAP_HTTP_ALL = (NS_SOAP_HTTP_1_1,)
  287.     NS_SOAP_HTTP = NS_SOAP_HTTP_1_1
  288.     _wsdl_uri_mapping = {
  289.         NS_WSDL_1_1: '1.1' }
  290.     
  291.     def WSDLUriToVersion(self, uri):
  292.         value = self._wsdl_uri_mapping.get(uri)
  293.         if value is not None:
  294.             return value
  295.         
  296.         raise ValueError('Unsupported SOAP envelope uri: %s' % uri)
  297.  
  298.     
  299.     def GetWSDLUri(self, version):
  300.         attr = 'NS_WSDL_%s' % join(split(version, '.'), '_')
  301.         value = getattr(self, attr, None)
  302.         if value is not None:
  303.             return value
  304.         
  305.         raise ValueError('Unsupported WSDL version: %s' % version)
  306.  
  307.     
  308.     def GetWSDLSoapBindingUri(self, version):
  309.         attr = 'NS_SOAP_BINDING_%s' % join(split(version, '.'), '_')
  310.         value = getattr(self, attr, None)
  311.         if value is not None:
  312.             return value
  313.         
  314.         raise ValueError('Unsupported WSDL version: %s' % version)
  315.  
  316.     
  317.     def GetWSDLHttpBindingUri(self, version):
  318.         attr = 'NS_HTTP_BINDING_%s' % join(split(version, '.'), '_')
  319.         value = getattr(self, attr, None)
  320.         if value is not None:
  321.             return value
  322.         
  323.         raise ValueError('Unsupported WSDL version: %s' % version)
  324.  
  325.     
  326.     def GetWSDLMimeBindingUri(self, version):
  327.         attr = 'NS_MIME_BINDING_%s' % join(split(version, '.'), '_')
  328.         value = getattr(self, attr, None)
  329.         if value is not None:
  330.             return value
  331.         
  332.         raise ValueError('Unsupported WSDL version: %s' % version)
  333.  
  334.     
  335.     def GetWSDLHttpTransportUri(self, version):
  336.         attr = 'NS_SOAP_HTTP_%s' % join(split(version, '.'), '_')
  337.         value = getattr(self, attr, None)
  338.         if value is not None:
  339.             return value
  340.         
  341.         raise ValueError('Unsupported WSDL version: %s' % version)
  342.  
  343.     NS_XMLNS = 'http://www.w3.org/2000/xmlns/'
  344.     
  345.     def isElement(self, node, name, nsuri = None):
  346.         if node.nodeType != node.ELEMENT_NODE:
  347.             return 0
  348.         
  349.         if not node.localName == name and nsuri is None:
  350.             pass
  351.         return self.nsUriMatch(node.namespaceURI, nsuri)
  352.  
  353.     
  354.     def getElement(self, node, name, nsuri = None, default = join):
  355.         nsmatch = self.nsUriMatch
  356.         ELEMENT_NODE = node.ELEMENT_NODE
  357.         for child in node.childNodes:
  358.             if child.nodeType == ELEMENT_NODE:
  359.                 if child.localName == name or name is None:
  360.                     pass
  361.                 None if nsuri is None or nsmatch(child.namespaceURI, nsuri) else nsmatch(child.namespaceURI, nsuri)
  362.                 continue
  363.         
  364.         if default is not join:
  365.             return default
  366.         
  367.         raise KeyError, name
  368.  
  369.     
  370.     def getElementById(self, node, id, default = join):
  371.         attrget = self.getAttr
  372.         ELEMENT_NODE = node.ELEMENT_NODE
  373.         for child in node.childNodes:
  374.             if child.nodeType == ELEMENT_NODE:
  375.                 if attrget(child, 'id') == id:
  376.                     return child
  377.                 
  378.             attrget(child, 'id') == id
  379.         
  380.         if default is not join:
  381.             return default
  382.         
  383.         raise KeyError, name
  384.  
  385.     
  386.     def getMappingById(self, document, depth = None, element = None, mapping = None, level = 1):
  387.         if document is not None:
  388.             element = document.documentElement
  389.             mapping = { }
  390.         
  391.         attr = element._attrs.get('id', None)
  392.         if attr is not None:
  393.             mapping[attr.value] = element
  394.         
  395.         if depth is None or depth > level:
  396.             level = level + 1
  397.             ELEMENT_NODE = element.ELEMENT_NODE
  398.             for child in element.childNodes:
  399.                 if child.nodeType == ELEMENT_NODE:
  400.                     self.getMappingById(None, depth, child, mapping, level)
  401.                     continue
  402.             
  403.         
  404.         return mapping
  405.  
  406.     
  407.     def getElements(self, node, name, nsuri = None):
  408.         nsmatch = self.nsUriMatch
  409.         result = []
  410.         ELEMENT_NODE = node.ELEMENT_NODE
  411.         for child in node.childNodes:
  412.             if child.nodeType == ELEMENT_NODE:
  413.                 if child.localName == name or name is None:
  414.                     pass
  415.                 None if nsuri is None or nsmatch(child.namespaceURI, nsuri) else nsmatch(child.namespaceURI, nsuri)
  416.                 continue
  417.         
  418.         return result
  419.  
  420.     
  421.     def hasAttr(self, node, name, nsuri = None):
  422.         if nsuri is None:
  423.             if node.hasAttribute(name):
  424.                 return True
  425.             
  426.             return False
  427.         
  428.         return node.hasAttributeNS(nsuri, name)
  429.  
  430.     
  431.     def getAttr(self, node, name, nsuri = None, default = join):
  432.         if nsuri is None:
  433.             result = node._attrs.get(name, None)
  434.             if result is None:
  435.                 for item in node._attrsNS.keys():
  436.                     if item[1] == name:
  437.                         result = node._attrsNS[item]
  438.                         break
  439.                         continue
  440.                 
  441.             
  442.         else:
  443.             result = node._attrsNS.get((nsuri, name), None)
  444.         if result is not None:
  445.             return result.value
  446.         
  447.         if default is not join:
  448.             return default
  449.         
  450.         return ''
  451.  
  452.     
  453.     def getAttrs(self, node):
  454.         attrs = { }
  455.         for k, v in node._attrs.items():
  456.             attrs[k] = v.value
  457.         
  458.         return attrs
  459.  
  460.     
  461.     def getElementText(self, node, preserve_ws = None):
  462.         result = []
  463.         for child in node.childNodes:
  464.             nodetype = child.nodeType
  465.             if nodetype == child.TEXT_NODE or nodetype == child.CDATA_SECTION_NODE:
  466.                 result.append(child.nodeValue)
  467.                 continue
  468.         
  469.         value = join(result, '')
  470.         if preserve_ws is None:
  471.             value = strip(value)
  472.         
  473.         return value
  474.  
  475.     
  476.     def findNamespaceURI(self, prefix, node):
  477.         attrkey = (self.NS_XMLNS, prefix)
  478.         DOCUMENT_NODE = node.DOCUMENT_NODE
  479.         ELEMENT_NODE = node.ELEMENT_NODE
  480.         while node is None:
  481.             raise DOMException('Value for prefix %s not found.' % prefix)
  482.         if node.nodeType != ELEMENT_NODE:
  483.             node = node.parentNode
  484.             continue
  485.         
  486.         result = node._attrsNS.get(attrkey, None)
  487.         if result is not None:
  488.             return result.value
  489.         
  490.         if hasattr(node, '__imported__'):
  491.             raise DOMException('Value for prefix %s not found.' % prefix)
  492.         
  493.         node = node.parentNode
  494.         if node.nodeType == DOCUMENT_NODE:
  495.             raise DOMException('Value for prefix %s not found.' % prefix)
  496.             continue
  497.         continue
  498.  
  499.     
  500.     def findDefaultNS(self, node):
  501.         attrkey = (self.NS_XMLNS, 'xmlns')
  502.         DOCUMENT_NODE = node.DOCUMENT_NODE
  503.         ELEMENT_NODE = node.ELEMENT_NODE
  504.         while node.nodeType != ELEMENT_NODE:
  505.             node = node.parentNode
  506.             continue
  507.         result = node._attrsNS.get(attrkey, None)
  508.         if result is not None:
  509.             return result.value
  510.         
  511.         if hasattr(node, '__imported__'):
  512.             raise DOMException('Cannot determine default namespace.')
  513.         
  514.         node = node.parentNode
  515.         if node.nodeType == DOCUMENT_NODE:
  516.             raise DOMException('Cannot determine default namespace.')
  517.             continue
  518.         continue
  519.  
  520.     
  521.     def findTargetNS(self, node):
  522.         attrget = self.getAttr
  523.         attrkey = (self.NS_XMLNS, 'xmlns')
  524.         DOCUMENT_NODE = node.DOCUMENT_NODE
  525.         ELEMENT_NODE = node.ELEMENT_NODE
  526.         while node.nodeType != ELEMENT_NODE:
  527.             node = node.parentNode
  528.             continue
  529.         result = attrget(node, 'targetNamespace', default = None)
  530.         if result is not None:
  531.             return result
  532.         
  533.         node = node.parentNode
  534.         if node.nodeType == DOCUMENT_NODE:
  535.             raise DOMException('Cannot determine target namespace.')
  536.             continue
  537.         continue
  538.  
  539.     
  540.     def getTypeRef(self, element):
  541.         typeattr = self.getAttr(element, 'type', default = None)
  542.         if typeattr is None:
  543.             return None
  544.         
  545.         parts = typeattr.split(':', 1)
  546.         if len(parts) == 2:
  547.             nsuri = self.findNamespaceURI(parts[0], element)
  548.         else:
  549.             nsuri = self.findDefaultNS(element)
  550.         return (nsuri, parts[1])
  551.  
  552.     
  553.     def importNode(self, document, node, deep = 0):
  554.         nodetype = node.nodeType
  555.         if nodetype in (node.DOCUMENT_NODE, node.DOCUMENT_TYPE_NODE):
  556.             raise DOMException('Illegal node type for importNode')
  557.         
  558.         if nodetype == node.ENTITY_REFERENCE_NODE:
  559.             deep = 0
  560.         
  561.         clone = node.cloneNode(deep)
  562.         self._setOwnerDoc(document, clone)
  563.         clone.__imported__ = 1
  564.         return clone
  565.  
  566.     
  567.     def _setOwnerDoc(self, document, node):
  568.         node.ownerDocument = document
  569.         for child in node.childNodes:
  570.             self._setOwnerDoc(document, child)
  571.         
  572.  
  573.     
  574.     def nsUriMatch(self, value, wanted, strict = 0, tt = type(())):
  575.         if (value == wanted or type(wanted) is tt) and value in wanted:
  576.             return 1
  577.         
  578.         if not strict and value is not None:
  579.             if not type(wanted) is tt or wanted:
  580.                 pass
  581.             wanted = (wanted,)
  582.             if not value[-1:] != '/' or value:
  583.                 pass
  584.             value = value[:-1]
  585.             for item in wanted:
  586.                 if item == value or item[:-1] == value:
  587.                     return 1
  588.                     continue
  589.             
  590.         
  591.         return 0
  592.  
  593.     
  594.     def createDocument(self, nsuri, qname, doctype = None):
  595.         impl = xml.dom.minidom.getDOMImplementation()
  596.         return impl.createDocument(nsuri, qname, doctype)
  597.  
  598.     
  599.     def loadDocument(self, data):
  600.         return xml.dom.minidom.parse(data)
  601.  
  602.     
  603.     def loadFromURL(self, url):
  604.         if isfile(url) is True:
  605.             file = open(url, 'r')
  606.         else:
  607.             file = urlopen(url)
  608.         
  609.         try:
  610.             result = self.loadDocument(file)
  611.         except Exception:
  612.             ex = None
  613.             file.close()
  614.             raise ParseError(('Failed to load document %s' % url,) + ex.args)
  615.  
  616.         file.close()
  617.         return result
  618.  
  619.  
  620. DOM = DOM()
  621.  
  622. class MessageInterface:
  623.     
  624.     def __init__(self, sw):
  625.         self.sw = None
  626.         if type(sw) != weakref.ReferenceType and sw is not None:
  627.             self.sw = weakref.ref(sw)
  628.         else:
  629.             self.sw = sw
  630.  
  631.     
  632.     def AddCallback(self, func, *arglist):
  633.         self.sw().AddCallback(func, *arglist)
  634.  
  635.     
  636.     def Known(self, obj):
  637.         return self.sw().Known(obj)
  638.  
  639.     
  640.     def Forget(self, obj):
  641.         return self.sw().Forget(obj)
  642.  
  643.     
  644.     def canonicalize(self):
  645.         raise NotImplementedError, ''
  646.  
  647.     
  648.     def createDocument(self, namespaceURI = SOAP.ENV, localName = 'Envelope'):
  649.         raise NotImplementedError, ''
  650.  
  651.     
  652.     def createAppendElement(self, namespaceURI, localName):
  653.         raise NotImplementedError, ''
  654.  
  655.     
  656.     def findNamespaceURI(self, qualifiedName):
  657.         raise NotImplementedError, ''
  658.  
  659.     
  660.     def resolvePrefix(self, prefix):
  661.         raise NotImplementedError, ''
  662.  
  663.     
  664.     def setAttributeNS(self, namespaceURI, localName, value):
  665.         raise NotImplementedError, ''
  666.  
  667.     
  668.     def setAttributeType(self, namespaceURI, localName):
  669.         raise NotImplementedError, ''
  670.  
  671.     
  672.     def setNamespaceAttribute(self, namespaceURI, prefix):
  673.         raise NotImplementedError, ''
  674.  
  675.  
  676.  
  677. class ElementProxy(Base, MessageInterface):
  678.     _soap_env_prefix = 'SOAP-ENV'
  679.     _soap_enc_prefix = 'SOAP-ENC'
  680.     _zsi_prefix = 'ZSI'
  681.     _xsd_prefix = 'xsd'
  682.     _xsi_prefix = 'xsi'
  683.     _xml_prefix = 'xml'
  684.     _xmlns_prefix = 'xmlns'
  685.     _soap_env_nsuri = SOAP.ENV
  686.     _soap_enc_nsuri = SOAP.ENC
  687.     _zsi_nsuri = ZSI_SCHEMA_URI
  688.     _xsd_nsuri = SCHEMA.XSD3
  689.     _xsi_nsuri = SCHEMA.XSI3
  690.     _xml_nsuri = XMLNS.XML
  691.     _xmlns_nsuri = XMLNS.BASE
  692.     standard_ns = {
  693.         _xml_prefix: _xml_nsuri,
  694.         _xmlns_prefix: _xmlns_nsuri }
  695.     reserved_ns = {
  696.         _soap_env_prefix: _soap_env_nsuri,
  697.         _soap_enc_prefix: _soap_enc_nsuri,
  698.         _zsi_prefix: _zsi_nsuri,
  699.         _xsd_prefix: _xsd_nsuri,
  700.         _xsi_prefix: _xsi_nsuri }
  701.     name = None
  702.     namespaceURI = None
  703.     
  704.     def __init__(self, sw, message = None):
  705.         self._indx = 0
  706.         MessageInterface.__init__(self, sw)
  707.         Base.__init__(self)
  708.         self._dom = DOM
  709.         self.node = None
  710.         if type(message) in (types.StringType, types.UnicodeType):
  711.             self.loadFromString(message)
  712.         elif isinstance(message, ElementProxy):
  713.             self.node = message._getNode()
  714.         else:
  715.             self.node = message
  716.         self.processorNss = self.standard_ns.copy()
  717.         self.processorNss.update(self.reserved_ns)
  718.  
  719.     
  720.     def __str__(self):
  721.         return self.toString()
  722.  
  723.     
  724.     def evaluate(self, expression, processorNss = None):
  725.         XPath = XPath
  726.         import Ft.Xml
  727.         if not processorNss:
  728.             context = XPath.Context.Context(self.node, processorNss = self.processorNss)
  729.         else:
  730.             context = XPath.Context.Context(self.node, processorNss = processorNss)
  731.         nodes = expression.evaluate(context)
  732.         return (map,)((lambda node: ElementProxy(self.sw, node)), nodes)
  733.  
  734.     
  735.     def checkNode(self, namespaceURI = None, localName = None):
  736.         if not namespaceURI:
  737.             pass
  738.         namespaceURI = self.namespaceURI
  739.         if not localName:
  740.             pass
  741.         localName = self.name
  742.         check = False
  743.         if localName and self.node:
  744.             check = self._dom.isElement(self.node, localName, namespaceURI)
  745.         
  746.         if not check:
  747.             raise NamespaceError, 'unexpected node type %s, expecting %s' % (self.node, localName)
  748.         
  749.  
  750.     
  751.     def setNode(self, node = None):
  752.         if node:
  753.             if isinstance(node, ElementProxy):
  754.                 self.node = node._getNode()
  755.             else:
  756.                 self.node = node
  757.         elif self.node:
  758.             node = self._dom.getElement(self.node, self.name, self.namespaceURI, default = None)
  759.             if not node:
  760.                 raise NamespaceError, 'cant find element (%s,%s)' % (self.namespaceURI, self.name)
  761.             
  762.             self.node = node
  763.         else:
  764.             self.createDocument(self.namespaceURI, localName = self.name, doctype = None)
  765.         self.checkNode()
  766.  
  767.     
  768.     def _getNode(self):
  769.         return self.node
  770.  
  771.     
  772.     def _getElements(self):
  773.         return self._dom.getElements(self.node, name = None)
  774.  
  775.     
  776.     def _getOwnerDocument(self):
  777.         if not self.node.ownerDocument:
  778.             pass
  779.         return self.node
  780.  
  781.     
  782.     def _getUniquePrefix(self):
  783.         while None:
  784.             self._indx += 1
  785.             prefix = 'ns%d' % self._indx
  786.             
  787.             try:
  788.                 self._dom.findNamespaceURI(prefix, self._getNode())
  789.             continue
  790.             except DOMException:
  791.                 self
  792.                 ex = self
  793.                 break
  794.                 continue
  795.             
  796.  
  797.             return prefix
  798.  
  799.     
  800.     def _getPrefix(self, node, nsuri):
  801.         
  802.         try:
  803.             if node and node.nodeType == node.ELEMENT_NODE and nsuri == self._dom.findDefaultNS(node):
  804.                 return None
  805.         except DOMException:
  806.             ex = None
  807.  
  808.         if nsuri == XMLNS.XML:
  809.             return self._xml_prefix
  810.         
  811.         if node.nodeType == Node.ELEMENT_NODE:
  812.             for attr in node.attributes.values():
  813.                 if attr.namespaceURI == XMLNS.BASE and nsuri == attr.value:
  814.                     return attr.localName
  815.                     continue
  816.             elif node.parentNode:
  817.                 return self._getPrefix(node.parentNode, nsuri)
  818.             
  819.         
  820.         raise NamespaceError, 'namespaceURI "%s" is not defined' % nsuri
  821.  
  822.     
  823.     def _appendChild(self, node):
  824.         if node is None:
  825.             raise TypeError, 'node is None'
  826.         
  827.         self.node.appendChild(node)
  828.  
  829.     
  830.     def _insertBefore(self, newChild, refChild):
  831.         self.node.insertBefore(newChild, refChild)
  832.  
  833.     
  834.     def _setAttributeNS(self, namespaceURI, qualifiedName, value):
  835.         self.node.setAttributeNS(namespaceURI, qualifiedName, value)
  836.  
  837.     
  838.     def isFault(self):
  839.         return False
  840.  
  841.     
  842.     def getPrefix(self, namespaceURI):
  843.         
  844.         try:
  845.             prefix = self._getPrefix(node = self.node, nsuri = namespaceURI)
  846.         except NamespaceError:
  847.             ex = None
  848.             prefix = self._getUniquePrefix()
  849.             self.setNamespaceAttribute(prefix, namespaceURI)
  850.  
  851.         return prefix
  852.  
  853.     
  854.     def getDocument(self):
  855.         return self._getOwnerDocument()
  856.  
  857.     
  858.     def setDocument(self, document):
  859.         self.node = document
  860.  
  861.     
  862.     def importFromString(self, xmlString):
  863.         doc = self._dom.loadDocument(StringIO(xmlString))
  864.         node = self._dom.getElement(doc, name = None)
  865.         clone = self.importNode(node)
  866.         self._appendChild(clone)
  867.  
  868.     
  869.     def importNode(self, node):
  870.         if isinstance(node, ElementProxy):
  871.             node = node._getNode()
  872.         
  873.         return self._dom.importNode(self._getOwnerDocument(), node, deep = 1)
  874.  
  875.     
  876.     def loadFromString(self, data):
  877.         self.node = self._dom.loadDocument(StringIO(data))
  878.  
  879.     
  880.     def canonicalize(self):
  881.         return Canonicalize(self.node)
  882.  
  883.     
  884.     def toString(self):
  885.         return self.canonicalize()
  886.  
  887.     
  888.     def createDocument(self, namespaceURI, localName, doctype = None):
  889.         prefix = self._soap_env_prefix
  890.         if namespaceURI == self.reserved_ns[prefix]:
  891.             qualifiedName = '%s:%s' % (prefix, localName)
  892.         elif localName is localName:
  893.             pass
  894.         elif localName is None:
  895.             self.node = self._dom.createDocument(None, None, None)
  896.             return None
  897.         else:
  898.             raise KeyError, 'only support creation of document in %s' % self.reserved_ns[prefix]
  899.         document = self._dom.createDocument(nsuri = namespaceURI, qname = qualifiedName, doctype = doctype)
  900.         self.node = document.childNodes[0]
  901.         for prefix, nsuri in self.reserved_ns.items():
  902.             self._setAttributeNS(namespaceURI = self._xmlns_nsuri, qualifiedName = '%s:%s' % (self._xmlns_prefix, prefix), value = nsuri)
  903.         
  904.  
  905.     
  906.     def hasAttribute(self, namespaceURI, localName):
  907.         return self._dom.hasAttr(self._getNode(), name = localName, nsuri = namespaceURI)
  908.  
  909.     
  910.     def setAttributeType(self, namespaceURI, localName):
  911.         self.logger.debug('setAttributeType: (%s,%s)', namespaceURI, localName)
  912.         value = localName
  913.         if namespaceURI:
  914.             value = '%s:%s' % (self.getPrefix(namespaceURI), localName)
  915.         
  916.         xsi_prefix = self.getPrefix(self._xsi_nsuri)
  917.         self._setAttributeNS(self._xsi_nsuri, '%s:type' % xsi_prefix, value)
  918.  
  919.     
  920.     def createAttributeNS(self, namespace, name, value):
  921.         document = self._getOwnerDocument()
  922.         attrNode = document.createAttributeNS(namespace, name, value)
  923.  
  924.     
  925.     def setAttributeNS(self, namespaceURI, localName, value):
  926.         prefix = None
  927.         if namespaceURI:
  928.             
  929.             try:
  930.                 prefix = self.getPrefix(namespaceURI)
  931.             except KeyError:
  932.                 ex = None
  933.                 prefix = 'ns2'
  934.                 self.setNamespaceAttribute(prefix, namespaceURI)
  935.             except:
  936.                 None<EXCEPTION MATCH>KeyError
  937.             
  938.  
  939.         None<EXCEPTION MATCH>KeyError
  940.         qualifiedName = localName
  941.         if prefix:
  942.             qualifiedName = '%s:%s' % (prefix, localName)
  943.         
  944.         self._setAttributeNS(namespaceURI, qualifiedName, value)
  945.  
  946.     
  947.     def setNamespaceAttribute(self, prefix, namespaceURI):
  948.         self._setAttributeNS(XMLNS.BASE, 'xmlns:%s' % prefix, namespaceURI)
  949.  
  950.     
  951.     def createElementNS(self, namespace, qname):
  952.         document = self._getOwnerDocument()
  953.         node = document.createElementNS(namespace, qname)
  954.         return ElementProxy(self.sw, node)
  955.  
  956.     
  957.     def createAppendSetElement(self, namespaceURI, localName, prefix = None):
  958.         node = self.createAppendElement(namespaceURI, localName, prefix = None)
  959.         node = node._getNode()
  960.         self._setNode(node._getNode())
  961.  
  962.     
  963.     def createAppendElement(self, namespaceURI, localName, prefix = None):
  964.         declare = False
  965.         qualifiedName = localName
  966.         if namespaceURI:
  967.             
  968.             try:
  969.                 prefix = self.getPrefix(namespaceURI)
  970.             except:
  971.                 declare = True
  972.                 if not prefix:
  973.                     pass
  974.                 prefix = self._getUniquePrefix()
  975.  
  976.             if prefix:
  977.                 qualifiedName = '%s:%s' % (prefix, localName)
  978.             
  979.         
  980.         node = self.createElementNS(namespaceURI, qualifiedName)
  981.         if declare:
  982.             node._setAttributeNS(XMLNS.BASE, 'xmlns:%s' % prefix, namespaceURI)
  983.         
  984.         self._appendChild(node = node._getNode())
  985.         return node
  986.  
  987.     
  988.     def createInsertBefore(self, namespaceURI, localName, refChild):
  989.         qualifiedName = localName
  990.         prefix = self.getPrefix(namespaceURI)
  991.         if prefix:
  992.             qualifiedName = '%s:%s' % (prefix, localName)
  993.         
  994.         node = self.createElementNS(namespaceURI, qualifiedName)
  995.         self._insertBefore(newChild = node._getNode(), refChild = refChild._getNode())
  996.         return node
  997.  
  998.     
  999.     def getElement(self, namespaceURI, localName):
  1000.         node = self._dom.getElement(self.node, localName, namespaceURI, default = None)
  1001.         if node:
  1002.             return ElementProxy(self.sw, node)
  1003.         
  1004.  
  1005.     
  1006.     def getAttributeValue(self, namespaceURI, localName):
  1007.         if self.hasAttribute(namespaceURI, localName):
  1008.             attr = self.node.getAttributeNodeNS(namespaceURI, localName)
  1009.             return attr.value
  1010.         
  1011.  
  1012.     
  1013.     def getValue(self):
  1014.         return self._dom.getElementText(self.node, preserve_ws = True)
  1015.  
  1016.     
  1017.     def createAppendTextNode(self, pyobj):
  1018.         node = self.createTextNode(pyobj)
  1019.         self._appendChild(node = node._getNode())
  1020.         return node
  1021.  
  1022.     
  1023.     def createTextNode(self, pyobj):
  1024.         document = self._getOwnerDocument()
  1025.         node = document.createTextNode(pyobj)
  1026.         return ElementProxy(self.sw, node)
  1027.  
  1028.     
  1029.     def findNamespaceURI(self, qualifiedName):
  1030.         parts = SplitQName(qualifiedName)
  1031.         element = self._getNode()
  1032.         if len(parts) == 1:
  1033.             return (self._dom.findTargetNS(element), value)
  1034.         
  1035.         return self._dom.findNamespaceURI(parts[0], element)
  1036.  
  1037.     
  1038.     def resolvePrefix(self, prefix):
  1039.         element = self._getNode()
  1040.         return self._dom.findNamespaceURI(prefix, element)
  1041.  
  1042.     
  1043.     def getSOAPEnvURI(self):
  1044.         return self._soap_env_nsuri
  1045.  
  1046.     
  1047.     def isEmpty(self):
  1048.         return not (self.node)
  1049.  
  1050.  
  1051.  
  1052. class Collection(UserDict):
  1053.     
  1054.     default = lambda self, k: k.name
  1055.     
  1056.     def __init__(self, parent, key = None):
  1057.         UserDict.__init__(self)
  1058.         self.parent = weakref.ref(parent)
  1059.         self.list = []
  1060.         if not key:
  1061.             pass
  1062.         self._func = self.default
  1063.  
  1064.     
  1065.     def __getitem__(self, key):
  1066.         if type(key) is type(1):
  1067.             return self.list[key]
  1068.         
  1069.         return self.data[key]
  1070.  
  1071.     
  1072.     def __setitem__(self, key, item):
  1073.         item.parent = weakref.ref(self)
  1074.         self.list.append(item)
  1075.         self.data[key] = item
  1076.  
  1077.     
  1078.     def keys(self):
  1079.         return (map,)((lambda i: self._func(i)), self.list)
  1080.  
  1081.     
  1082.     def items(self):
  1083.         return (map,)((lambda i: (self._func(i), i)), self.list)
  1084.  
  1085.     
  1086.     def values(self):
  1087.         return self.list
  1088.  
  1089.  
  1090.  
  1091. class CollectionNS(UserDict):
  1092.     
  1093.     default = lambda self, k: k.name
  1094.     
  1095.     def __init__(self, parent, key = None):
  1096.         UserDict.__init__(self)
  1097.         self.parent = weakref.ref(parent)
  1098.         self.targetNamespace = None
  1099.         self.list = []
  1100.         if not key:
  1101.             pass
  1102.         self._func = self.default
  1103.  
  1104.     
  1105.     def __getitem__(self, key):
  1106.         self.targetNamespace = self.parent().targetNamespace
  1107.         if type(key) is types.IntType:
  1108.             return self.list[key]
  1109.         elif self._CollectionNS__isSequence(key):
  1110.             (nsuri, name) = key
  1111.             return self.data[nsuri][name]
  1112.         
  1113.         return self.data[self.parent().targetNamespace][key]
  1114.  
  1115.     
  1116.     def __setitem__(self, key, item):
  1117.         item.parent = weakref.ref(self)
  1118.         self.list.append(item)
  1119.         targetNamespace = getattr(item, 'targetNamespace', self.parent().targetNamespace)
  1120.         if not self.data.has_key(targetNamespace):
  1121.             self.data[targetNamespace] = { }
  1122.         
  1123.         self.data[targetNamespace][key] = item
  1124.  
  1125.     
  1126.     def __isSequence(self, key):
  1127.         if type(key) in (types.TupleType, types.ListType):
  1128.             pass
  1129.         return len(key) == 2
  1130.  
  1131.     
  1132.     def keys(self):
  1133.         keys = []
  1134.         for None in self.data.keys():
  1135.             tns = None
  1136.         
  1137.         return keys
  1138.  
  1139.     
  1140.     def items(self):
  1141.         return (map,)((lambda i: (self._func(i), i)), self.list)
  1142.  
  1143.     
  1144.     def values(self):
  1145.         return self.list
  1146.  
  1147.  
  1148. from xml.dom.pulldom import PullDOM, START_ELEMENT
  1149.  
  1150. def startPrefixMapping(self, prefix, uri):
  1151.     if not hasattr(self, '_xmlns_attrs'):
  1152.         self._xmlns_attrs = []
  1153.     
  1154.     if not prefix:
  1155.         pass
  1156.     self._xmlns_attrs.append(('xmlns', uri))
  1157.     self._ns_contexts.append(self._current_context.copy())
  1158.     if not prefix:
  1159.         pass
  1160.     self._current_context[uri] = ''
  1161.  
  1162. PullDOM.startPrefixMapping = startPrefixMapping
  1163.  
  1164. def startElementNS(self, name, tagName, attrs):
  1165.     xmlns_uri = 'http://www.w3.org/2000/xmlns/'
  1166.     xmlns_attrs = getattr(self, '_xmlns_attrs', None)
  1167.     if xmlns_attrs is not None:
  1168.         for aname, value in xmlns_attrs:
  1169.             attrs._attrs[(xmlns_uri, aname)] = value
  1170.         
  1171.         self._xmlns_attrs = []
  1172.     
  1173.     (uri, localname) = name
  1174.     if uri:
  1175.         if tagName is None:
  1176.             prefix = self._current_context[uri]
  1177.             if prefix:
  1178.                 tagName = prefix + ':' + localname
  1179.             else:
  1180.                 tagName = localname
  1181.         
  1182.         if self.document:
  1183.             node = self.document.createElementNS(uri, tagName)
  1184.         else:
  1185.             node = self.buildDocument(uri, tagName)
  1186.     elif self.document:
  1187.         node = self.document.createElement(localname)
  1188.     else:
  1189.         node = self.buildDocument(None, localname)
  1190.     for aname, value in attrs.items():
  1191.         (a_uri, a_localname) = aname
  1192.         if a_uri == xmlns_uri:
  1193.             if a_localname == 'xmlns':
  1194.                 qname = a_localname
  1195.             else:
  1196.                 qname = 'xmlns:' + a_localname
  1197.             attr = self.document.createAttributeNS(a_uri, qname)
  1198.             node.setAttributeNodeNS(attr)
  1199.         elif a_uri:
  1200.             prefix = self._current_context[a_uri]
  1201.             if prefix:
  1202.                 qname = prefix + ':' + a_localname
  1203.             else:
  1204.                 qname = a_localname
  1205.             attr = self.document.createAttributeNS(a_uri, qname)
  1206.             node.setAttributeNodeNS(attr)
  1207.         else:
  1208.             attr = self.document.createAttribute(a_localname)
  1209.             node.setAttributeNode(attr)
  1210.         attr.value = value
  1211.     
  1212.     self.lastEvent[1] = [
  1213.         (START_ELEMENT, node),
  1214.         None]
  1215.     self.lastEvent = self.lastEvent[1]
  1216.     self.push(node)
  1217.  
  1218. PullDOM.startElementNS = startElementNS
  1219.  
  1220. def _clone_node(node, deep, newOwnerDocument):
  1221.     if node.ownerDocument.isSameNode(newOwnerDocument):
  1222.         operation = xml.dom.UserDataHandler.NODE_CLONED
  1223.     else:
  1224.         operation = xml.dom.UserDataHandler.NODE_IMPORTED
  1225.     if node.nodeType == xml.dom.minidom.Node.ELEMENT_NODE:
  1226.         clone = newOwnerDocument.createElementNS(node.namespaceURI, node.nodeName)
  1227.         for attr in node.attributes.values():
  1228.             clone.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.value)
  1229.             (prefix, tag) = xml.dom.minidom._nssplit(attr.nodeName)
  1230.             if prefix == 'xmlns':
  1231.                 a = clone.getAttributeNodeNS(attr.namespaceURI, tag)
  1232.             elif prefix:
  1233.                 a = clone.getAttributeNodeNS(attr.namespaceURI, tag)
  1234.             else:
  1235.                 a = clone.getAttributeNodeNS(attr.namespaceURI, attr.nodeName)
  1236.             a.specified = attr.specified
  1237.         
  1238.         if deep:
  1239.             for child in node.childNodes:
  1240.                 c = xml.dom.minidom._clone_node(child, deep, newOwnerDocument)
  1241.                 clone.appendChild(c)
  1242.             
  1243.         
  1244.     elif node.nodeType == xml.dom.minidom.Node.DOCUMENT_FRAGMENT_NODE:
  1245.         clone = newOwnerDocument.createDocumentFragment()
  1246.         if deep:
  1247.             for child in node.childNodes:
  1248.                 c = xml.dom.minidom._clone_node(child, deep, newOwnerDocument)
  1249.                 clone.appendChild(c)
  1250.             
  1251.         
  1252.     elif node.nodeType == xml.dom.minidom.Node.TEXT_NODE:
  1253.         clone = newOwnerDocument.createTextNode(node.data)
  1254.     elif node.nodeType == xml.dom.minidom.Node.CDATA_SECTION_NODE:
  1255.         clone = newOwnerDocument.createCDATASection(node.data)
  1256.     elif node.nodeType == xml.dom.minidom.Node.PROCESSING_INSTRUCTION_NODE:
  1257.         clone = newOwnerDocument.createProcessingInstruction(node.target, node.data)
  1258.     elif node.nodeType == xml.dom.minidom.Node.COMMENT_NODE:
  1259.         clone = newOwnerDocument.createComment(node.data)
  1260.     elif node.nodeType == xml.dom.minidom.Node.ATTRIBUTE_NODE:
  1261.         clone = newOwnerDocument.createAttributeNS(node.namespaceURI, node.nodeName)
  1262.         clone.specified = True
  1263.         clone.value = node.value
  1264.     elif node.nodeType == xml.dom.minidom.Node.DOCUMENT_TYPE_NODE:
  1265.         operation = xml.dom.UserDataHandler.NODE_IMPORTED
  1266.         clone = newOwnerDocument.implementation.createDocumentType(node.name, node.publicId, node.systemId)
  1267.         clone.ownerDocument = newOwnerDocument
  1268.         if deep:
  1269.             clone.entities._seq = []
  1270.             clone.notations._seq = []
  1271.             for n in node.notations._seq:
  1272.                 notation = xml.dom.minidom.Notation(n.nodeName, n.publicId, n.systemId)
  1273.                 notation.ownerDocument = newOwnerDocument
  1274.                 clone.notations._seq.append(notation)
  1275.                 if hasattr(n, '_call_user_data_handler'):
  1276.                     n._call_user_data_handler(operation, n, notation)
  1277.                     continue
  1278.             
  1279.             for e in node.entities._seq:
  1280.                 entity = xml.dom.minidom.Entity(e.nodeName, e.publicId, e.systemId, e.notationName)
  1281.                 entity.actualEncoding = e.actualEncoding
  1282.                 entity.encoding = e.encoding
  1283.                 entity.version = e.version
  1284.                 entity.ownerDocument = newOwnerDocument
  1285.                 clone.entities._seq.append(entity)
  1286.                 if hasattr(e, '_call_user_data_handler'):
  1287.                     e._call_user_data_handler(operation, n, entity)
  1288.                     continue
  1289.             
  1290.         
  1291.     else:
  1292.         raise xml.dom.NotSupportedErr('Cannot clone node %s' % repr(node))
  1293.     if hasattr(node, '_call_user_data_handler'):
  1294.         node._call_user_data_handler(operation, node, clone)
  1295.     
  1296.     return clone
  1297.  
  1298. xml.dom.minidom._clone_node = _clone_node
  1299.